package com.llb666.common.core.web.response;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.llb666.common.core.web.error.ErrorCode;

/**
 * 带数据data的通用响应对象.
 *
 * @param <T> 泛型
 * @author llb666
 */
public class DataResponse<T> extends BaseResponse {

    /**
     * 响应中的数据
     */
    private final T data;

    public T getData() {
        return data;
    }

    private DataResponse(ErrorCode errCode) {
        super(errCode.getCode(), errCode.getMsg());
        this.data = null;
    }

    private DataResponse(ErrorCode errCode, String message) {
        this.status = errCode.getCode();
        this.msg = message;
        this.data = null;
    }

    @JsonCreator
    public DataResponse(@JsonProperty("status") Integer status,
                        @JsonProperty("msg") String msg,
                        @JsonProperty("data") T data) {
        super(status, msg);
        this.data = data;
    }

    private DataResponse(ErrorCode errCode, T data) {
        this.status = errCode.getCode();
        this.msg = errCode.getMsg();
        this.data = data;
    }

    /**
     * 成功响应.
     *
     * @param data 响应数据
     * @param <T>  数据泛型
     * @return DataResponse
     */
    public static <T> DataResponse<T> ok(T data) {
        return new DataResponse<>(SUCCESS_CODE, SUCCESS_MSG, data);
    }

    /**
     * 失败响应.
     *
     * @param errorCode 失败错误码.
     * @param <T>       数据泛型
     * @return DataResponse
     */
    public static <T> DataResponse<T> fail(ErrorCode errorCode) {
        return new DataResponse<>(errorCode);
    }

    /**
     * 带自定义消息的失败响应.
     *
     * @param errorCode 失败错误码
     * @param message   自定义错误消息
     * @param <T>       数据泛型
     * @return DataResponse
     */
    public static <T> DataResponse<T> fail(ErrorCode errorCode, String message) {
        return new DataResponse<>(errorCode, message);
    }

    /**
     * 错误码为500的失败响应.
     *
     * @param msg 自定义错误消息.
     * @param <T> 数据泛型
     * @return DataResponse
     */
    public static <T> DataResponse<T> errorMsg(String msg) {
        return new DataResponse<>(500, msg, null);
    }

    /**
     * 错误码为501的失败响应,包含返回错误数据.默认错误消息为"error".
     *
     * @param data 失败响应的错误数据
     * @param <T>  数据泛型
     * @return DataResponse
     */
    public static <T> DataResponse<T> errorMap(T data) {
        return new DataResponse<T>(501, "error", data);
    }

}
